package com.lovely602.algorithm.leetcode.basicprogramming50;


/**
 * 389 找不同
 * <p>
 * 给定两个字符串 s 和 t ，它们只包含小写字母。
 * <p>
 * 字符串 t 由字符串 s 随机重排，然后在随机位置添加一个字母。
 * <p>
 * 请找出在 t 中被添加的字母。
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "abcd", t = "abcde"
 * 输出："e"
 * 解释：'e' 是那个被添加的字母。
 * 示例 2：
 * <p>
 * 输入：s = "", t = "y"
 * 输出："y"
 * <p>
 * <p>
 * 提示：
 * <p>
 * 0 <= s.length <= 1000
 * t.length == s.length + 1
 * s 和 t 只包含小写字母
 *
 * @author lizhixing
 */
public class Question02 {


    public static void main(String[] args) {
        String s = "qwdfgh";
        String t = "qwddfgh";
        Question02 question = new Question02();
        char theDifferenceCount = question.findTheDifference_count(s, t);
        System.out.println("findTheDifference_count：" + theDifferenceCount);

        char theDifferenceSum = question.findTheDifference_sum(s, t);
        System.out.println("findTheDifference_sum：" + theDifferenceSum);

        char findTheDifferenceXor = question.findTheDifference_xor(s, t);
        System.out.println("findTheDifference_xor：" + findTheDifferenceXor);
    }

    /**
     * 计数法
     * <p>
     * 首先遍历字符串 s，对其中的每个字符都将计数值加 1；然后遍历字符串 t，对其中的每个字符都将计数值减 1。
     * 当发现某个字符计数值为负数时，说明该字符在字符串 t 中出现的次数大于在字符串 s 中出现的次数，因此该字符为被添加的字符。
     */
    public char findTheDifference_count(String s, String t) {


        int[] chars = new int[26];
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            chars[ch - 'a']++;
        }

        for (int j = 0; j < t.length(); j++) {
            char ch = t.charAt(j);
            chars[ch - 'a']--;
            if (chars[ch - 'a'] < 0) {
                return ch;
            }
        }

        return ' ';
    }

    /**
     * 求和法
     * <p>
     * 将字符串 s 中每个字符的 ASCII 码的值求和，得到 A
     * s
     * ​
     * ；对字符串 t 同样的方法得到 A
     * t
     * ​
     * 。两者的差值 A
     * t
     * ​
     * −A
     * s
     * ​
     * 即代表了被添加的字符。
     */
    public char findTheDifference_sum(String s, String t) {

        int sSum = 0;
        int tSum = 0;

        for (int i = 0; i < s.length(); i++) {
            sSum += s.charAt(i);
        }

        for (int i = 0; i < t.length(); i++) {
            tSum += t.charAt(i);
        }

        return (char) (tSum - sSum);

    }

    /**
     * 或运算
     */
    public char findTheDifference_xor(String s, String t) {

        int ans = 0;

        int i = 0;
        int j = 0;
        int sLength = s.length();
        int tLength = t.length();

        while (i < sLength || j < tLength) {

            if (i < sLength) {
                ans ^= s.charAt(i);
                i++;
            }
            if (j < tLength) {
                ans ^= t.charAt(j);
                j++;
            }

        }

        return (char) ans;

    }


}
